Librerías

library(dplyr)
library(data.table)
library(lubridate)
library(ggplot2)

Funciones

isValidEmail <- function(x) {
        grepl("\\<[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\>", as.character(x), ignore.case=TRUE)
}

Objetivo

El objetivo de este script es el filtrado de los datos de origen de e-Preselec ESP para su carga en Cornerstone para el ámbito Holding.

En la subcarpeta datos_originales/ están todos los archivos fuente obtenidos de e-Preselec ESP

En la subcarpeta output/ dejaremos los ficheros de salida ya filtrados y limpiados

Maestro de Candidatos

Leemos el fichero de maestro de candidatos y vamos a ir eliminando candidatos por diferentes criterios

Primero anonimizados, nombre en blanco, email en blanco, emails con formato inválido

nombre <- "datos_originales/01-Candidatos_Datos_Personales.csv"
fichero_candidatos <- read.csv2(nombre, sep = "~", quote = "", fileEncoding = "UTF-8", stringsAsFactors = TRUE)
candidatos_maestro <- tbl_df(fichero_candidatos)
candidatos_maestro <- filter(candidatos_maestro, NOMBRE != "XXXXXX")
candidatos_maestro <- filter(candidatos_maestro, NOMBRE != "")
candidatos_maestro <- filter(candidatos_maestro, EMAIL != "")
emails_incorectos <- filter(candidatos_maestro,!isValidEmail(EMAIL))
candidatos_maestro <- filter(candidatos_maestro, isValidEmail(EMAIL))

Estos son una muestra de los emails eliminados por tener un formato inválido

print(emails_incorectos$EMAIL)
  [1] f@es                               marianiclos@gmailcom               Madrid                            
  [4] fatimaseri@hotmailcom              jingzhang026@gmail                 vexredx.com                       
  [7] desconocido@desconocido            beagraciam@gmail.                  desconocido@desconocido           
 [10] isabeld84@hotmailcom               ---@---                            dddd@fff                          
 [13] javier.villegas.bartolome@gmailcom ---@---.com                        cvxv@fgdsf                        
 [16] aaa@aaa                            anaparragues@gmail                 xxxxx@xxxx                        
 [19] victor@andradas                    veroalondas@gmailcom               pabespmat@hotmailcom              
 [22] evamaria.naranjo@colmenero         Jose.mtnez.montoto@gmail.          flower464@hotmail                 
 [25] oscarandres_garcia@hotmailcom      ralen@458                          miguesn@hotmaile.s                
 [28] ---@hotmail.es                     irenesantor@gmailcom               juliosersan@gmailcom              
 [31] soniasubg@gmail                    francha69@gmail                    Rportillogmez@hotmail             
 [34] Sircris728@hotmail                 jose.meseguer2@gmail               Mdmglopez@gmail                   
 [37]  mariazabsan@gmail                 gema_1708@Hotmail. com             efg                               
 [40] rociosanzrg@hotmail                imbertguzman29@hotmail. com        Temale2@hotmail                   
 [43] aliciafrivas@gmail                 Mariajosegarci81@hotmail           A                                 
 [46] pilherca@gmail                     imerzab@gmail                      Mariajesus-93@Hotmail. Com        
 [49] Jmpriego86@gmail                   leticialopher@gmail. com           rocíomv1128@hotmail. com          
 [52] lourdesfolgueiraarias@Gmail. Com   romero.david@ hotmail.es           graciaouaglou@Gmail. com          
 [55] yosoymajo@hotmail. es              colombia9777@hotmail. com          mjiga@hotmail. com                
 [58] Orianahernandez85@gmail. Com       ragonel2004@hotmail. com           ee                                
 [61] trigoantonio25@gmail. com          Karito.km95@gmail. com             Karito.km95@gmail. com            
 [64] criscalles@gmail. com              ilham.sadiki@gmail. com            Manuel_gp89@hotmail. Com          
 [67] Manuel_gp89@hotmail. Com           Manuel_gp89@hotmail. Com           Manuel_gp89@hotmail. Com          
 [70] taniacarvajalcruz @hotmail.com     Jessicaandreuribelles@gmail        Joanafranco03@gmail               
 [73] patriciamoralpezuela@gmail. com    yo_rubiaa92                        Barraganhernandez ruben@ gmail.com
 [76] aaaa                               aaaa                               lauraochoalonso@gmail             
 [79] laura.herreroa@gmail               adarga2001@ yahoo.es               adrianajazminramirez2396          
 [82] adrianajazminramirez2396           adrianajazminramirez2396           adrianajazminramirez2396          
 [85] adrianajazminramirez2396           olgamcamps@yahoo. es               pazcampuzano28@gmail              
 [88] Lauramunozlopezbermejo@Gmail. Com  f.valentina.c@ gmail.com           antoniolopezcabeza @hotmail.com   
 [91] kimeragodoyarencibia@hotmail. com   warda_zin-warda@hotmail. com      irispayares@hotmail               
 [94] klarix501@gmail                    danielferrer87@gmail               carlosbotonvalderrabano@gmail     
 [97] yeco2963@hot                       corinnamarta.11@hotmailcom         maru2_torres @hotmail.com         
[100] nabilagimenoizquierdo@gmail        sonia-pt@hotmail                   Paulinagroeger@Gmail. Com         
[103] guadalupekey1905@hotmail           Calamardo231107@gmail              beaog_26952hotmail.com            
[106] virmarroncero@gmail                Niurmanmar@gmail. Com              Maya-1727@Hotmail. Com            
[109] Fua_12@hotmail. Com                afernandezdealbaalonso             rebecapelaezsuarez@gmail. com     
242258 Levels:    larazubimendi@gmail.com   teresa_vergara_alvarez@hotmail.com  amarantavg@yahoo.es ... zzzdelrosal@gmail.com

Tampoco vamos a cargar los candidatos que ya están incorporados como empleados

candidatos_maestro <- filter(candidatos_maestro, ESTADO != "Incorporado")

También vamos a eliminar los candidatos probablemente de prueba que tienen “infojobs” o “infoempleo” en su correo electrónico

candidatos_maestro <- filter(candidatos_maestro, !(EMAIL %like% "@infojobs"))
candidatos_maestro <- filter(candidatos_maestro, !(EMAIL %like% "@infoempleo"))
candidatos_maestro <- filter(candidatos_maestro, !(EMAIL %like% "@vacio.com"))

De los candidatos duplicados cargaremos únicamente una ocurrencia, la de fecha de actualización más reciente. Estos son alugunos de los repetidos

emails_repetidos <- candidatos_maestro %>% group_by(EMAIL) %>%
        summarise(count = n()) %>% 
        arrange(desc(count)) %>% filter(count > 1)
print(emails_repetidos)

Eliminamos pues los candidatos duplicados, dejando únicamente uno por email, el de fecha de actualización más reciente

candidatos_maestro <- candidatos_maestro %>% 
        arrange(desc(dmy_hms(FECHA_ACTUALIZACION)), desc(ID_CANDIDATO)) %>%
        distinct(EMAIL,.keep_all = TRUE) %>%
        arrange(ID_CANDIDATO)

Comprobamos si quedan duplicados

emails_repetidos <- candidatos_maestro %>% group_by(EMAIL) %>%
        summarise(count = n()) %>% 
        arrange(desc(count)) %>% filter(count > 1)
print(emails_repetidos)

A ver cuántos candidatos nos quedan (por fecha de actualización):

fechas <- select(candidatos_maestro,ID_CANDIDATO,FECHA_ACTUALIZACION)
fechas$FECHA_ACTUALIZACION <- as.POSIXct(date(dmy_hms(fechas$FECHA_ACTUALIZACION)))
ggplot(fechas, aes(FECHA_ACTUALIZACION)) + 
        geom_histogram(aes(fill=..count..)) +
        labs(title="Histograma de Candidatos Actualizados (mensual)") +
        labs(x="Fecha", y="Número de Actualizaciones") + 
        scale_x_datetime(breaks = date_breaks("18 months"),
                         labels = date_format("%Y-%b")
                          )

Y por fecha de alta

fechas <- select(candidatos_maestro,ID_CANDIDATO,FECHA_ALTA)
fechas$FECHA_ALTA <- as.POSIXct(date(dmy_hms(fechas$FECHA_ALTA)))
ggplot(fechas, aes(FECHA_ALTA)) + 
        geom_histogram(aes(fill=..count..)) +
        labs(title="Histograma de Candidatos dados de alta (mensual)") +
        labs(x="Fecha", y="Número de Actualizaciones") + 
        scale_x_datetime(breaks = date_breaks("18 months"),
                         labels = date_format("%Y-%b")
        )

Vamos a ver mejor los últimos dos años, desde Junio del 2015

fechas <- select(candidatos_maestro,ID_CANDIDATO,FECHA_ACTUALIZACION)
fechas$FECHA_ACTUALIZACION <- as.POSIXct(date(dmy_hms(fechas$FECHA_ACTUALIZACION)))
ggplot(fechas, aes(FECHA_ACTUALIZACION)) + 
        geom_histogram(aes(fill=..count..)) +
        labs(title="Histograma de Candidatos Actualizados (mensual)") +
        labs(x="Fecha", y="Número de Actualizaciones") + 
        scale_x_datetime(breaks = date_breaks("2 months"),
                         labels = date_format("%Y-%b"),
                         limits = c(as.POSIXct("2015-06-01"), 
                                    as.POSIXct("2017-06-01"))
                          )

fechas <- select(candidatos_maestro,ID_CANDIDATO,FECHA_ALTA)
fechas$FECHA_ALTA <- as.POSIXct(date(dmy_hms(fechas$FECHA_ALTA)))
ggplot(fechas, aes(FECHA_ALTA)) + 
        geom_histogram(aes(fill=..count..)) +
        labs(title="Histograma de Candidatos dados de alta (mensual)") +
        labs(x="Fecha", y="Número de Actualizaciones") + 
        scale_x_datetime(breaks = date_breaks("2 months"),
                         labels = date_format("%Y-%b"),
                         limits = c(as.POSIXct("2015-06-01"), 
                                    as.POSIXct("2017-06-01"))
        )

LS0tCnRpdGxlOiAiTGltcGllemEgeSBGaWx0cmFkbyBlLVByZXNlbGVjIHBhcmEgbGEgY2FyZ2EgZGUgSG9sZGluZyBlbiBDb3JuZXJzdG9uZSAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkxpYnJlcsOtYXMKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZ2dwbG90MikKYGBgCgpGdW5jaW9uZXMKYGBge3J9CmlzVmFsaWRFbWFpbCA8LSBmdW5jdGlvbih4KSB7CiAgICAgICAgZ3JlcGwoIlxcPFtBLVowLTkuXyUrLV0rQFtBLVowLTkuLV0rXFwuW0EtWl17Mix9XFw+IiwgYXMuY2hhcmFjdGVyKHgpLCBpZ25vcmUuY2FzZT1UUlVFKQp9CmBgYAoKCiNPYmpldGl2bwoKRWwgb2JqZXRpdm8gZGUgZXN0ZSBzY3JpcHQgZXMgZWwgZmlsdHJhZG8gZGUgbG9zIGRhdG9zIGRlIG9yaWdlbiBkZSBlLVByZXNlbGVjIEVTUCBwYXJhIHN1IGNhcmdhIGVuIENvcm5lcnN0b25lIHBhcmEgZWwgw6FtYml0byBIb2xkaW5nLgoKRW4gbGEgc3ViY2FycGV0YSBkYXRvc19vcmlnaW5hbGVzLyBlc3TDoW4gdG9kb3MgbG9zIGFyY2hpdm9zIGZ1ZW50ZSBvYnRlbmlkb3MgZGUgZS1QcmVzZWxlYyBFU1AKCkVuIGxhIHN1YmNhcnBldGEgb3V0cHV0LyBkZWphcmVtb3MgbG9zIGZpY2hlcm9zIGRlIHNhbGlkYSB5YSBmaWx0cmFkb3MgeSBsaW1waWFkb3MKCiNNYWVzdHJvIGRlIENhbmRpZGF0b3MKCkxlZW1vcyBlbCBmaWNoZXJvIGRlIG1hZXN0cm8gZGUgY2FuZGlkYXRvcyB5IHZhbW9zIGEgaXIgZWxpbWluYW5kbyBjYW5kaWRhdG9zIHBvciBkaWZlcmVudGVzIGNyaXRlcmlvcwoKUHJpbWVybyBhbm9uaW1pemFkb3MsIG5vbWJyZSBlbiBibGFuY28sIGVtYWlsIGVuIGJsYW5jbywgZW1haWxzIGNvbiBmb3JtYXRvIGludsOhbGlkbwpgYGB7cn0Kbm9tYnJlIDwtICJkYXRvc19vcmlnaW5hbGVzLzAxLUNhbmRpZGF0b3NfRGF0b3NfUGVyc29uYWxlcy5jc3YiCmZpY2hlcm9fY2FuZGlkYXRvcyA8LSByZWFkLmNzdjIobm9tYnJlLCBzZXAgPSAifiIsIHF1b3RlID0gIiIsIGZpbGVFbmNvZGluZyA9ICJVVEYtOCIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBUUlVFKQpjYW5kaWRhdG9zX21hZXN0cm8gPC0gdGJsX2RmKGZpY2hlcm9fY2FuZGlkYXRvcykKY2FuZGlkYXRvc19tYWVzdHJvIDwtIGZpbHRlcihjYW5kaWRhdG9zX21hZXN0cm8sIE5PTUJSRSAhPSAiWFhYWFhYIikKY2FuZGlkYXRvc19tYWVzdHJvIDwtIGZpbHRlcihjYW5kaWRhdG9zX21hZXN0cm8sIE5PTUJSRSAhPSAiIikKY2FuZGlkYXRvc19tYWVzdHJvIDwtIGZpbHRlcihjYW5kaWRhdG9zX21hZXN0cm8sIEVNQUlMICE9ICIiKQplbWFpbHNfaW5jb3JlY3RvcyA8LSBmaWx0ZXIoY2FuZGlkYXRvc19tYWVzdHJvLCFpc1ZhbGlkRW1haWwoRU1BSUwpKQpjYW5kaWRhdG9zX21hZXN0cm8gPC0gZmlsdGVyKGNhbmRpZGF0b3NfbWFlc3RybywgaXNWYWxpZEVtYWlsKEVNQUlMKSkKYGBgCkVzdG9zIHNvbiB1bmEgbXVlc3RyYSBkZSBsb3MgZW1haWxzIGVsaW1pbmFkb3MgcG9yIHRlbmVyIHVuIGZvcm1hdG8gaW52w6FsaWRvCmBgYHtyfQpwcmludChlbWFpbHNfaW5jb3JlY3RvcyRFTUFJTCkKYGBgCgpUYW1wb2NvIHZhbW9zIGEgY2FyZ2FyIGxvcyBjYW5kaWRhdG9zIHF1ZSB5YSBlc3TDoW4gaW5jb3Jwb3JhZG9zIGNvbW8gZW1wbGVhZG9zCmBgYHtyfQpjYW5kaWRhdG9zX21hZXN0cm8gPC0gZmlsdGVyKGNhbmRpZGF0b3NfbWFlc3RybywgRVNUQURPICE9ICJJbmNvcnBvcmFkbyIpCgpgYGAKClRhbWJpw6luIHZhbW9zIGEgZWxpbWluYXIgbG9zIGNhbmRpZGF0b3MgcHJvYmFibGVtZW50ZSBkZSBwcnVlYmEgcXVlIHRpZW5lbiAiaW5mb2pvYnMiIG8gImluZm9lbXBsZW8iIGVuIHN1IGNvcnJlbyBlbGVjdHLDs25pY28KYGBge3J9CmNhbmRpZGF0b3NfbWFlc3RybyA8LSBmaWx0ZXIoY2FuZGlkYXRvc19tYWVzdHJvLCAhKEVNQUlMICVsaWtlJSAiQGluZm9qb2JzIikpCmNhbmRpZGF0b3NfbWFlc3RybyA8LSBmaWx0ZXIoY2FuZGlkYXRvc19tYWVzdHJvLCAhKEVNQUlMICVsaWtlJSAiQGluZm9lbXBsZW8iKSkKY2FuZGlkYXRvc19tYWVzdHJvIDwtIGZpbHRlcihjYW5kaWRhdG9zX21hZXN0cm8sICEoRU1BSUwgJWxpa2UlICJAdmFjaW8uY29tIikpCmBgYAoKRGUgbG9zIGNhbmRpZGF0b3MgZHVwbGljYWRvcyBjYXJnYXJlbW9zIMO6bmljYW1lbnRlIHVuYSBvY3VycmVuY2lhLCBsYSBkZSBmZWNoYSBkZSBhY3R1YWxpemFjacOzbiBtw6FzIHJlY2llbnRlLiBFc3RvcyBzb24gYWx1Z3Vub3MgZGUgbG9zIHJlcGV0aWRvcwpgYGB7cn0KZW1haWxzX3JlcGV0aWRvcyA8LSBjYW5kaWRhdG9zX21hZXN0cm8gJT4lIGdyb3VwX2J5KEVNQUlMKSAlPiUKICAgICAgICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICAgICAgICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUgZmlsdGVyKGNvdW50ID4gMSkKcHJpbnQoZW1haWxzX3JlcGV0aWRvcykKYGBgCgpFbGltaW5hbW9zIHB1ZXMgbG9zIGNhbmRpZGF0b3MgZHVwbGljYWRvcywgZGVqYW5kbyDDum5pY2FtZW50ZSB1bm8gcG9yIGVtYWlsLCBlbCBkZSBmZWNoYSBkZSBhY3R1YWxpemFjacOzbiBtw6FzIHJlY2llbnRlCmBgYHtyfQpjYW5kaWRhdG9zX21hZXN0cm8gPC0gY2FuZGlkYXRvc19tYWVzdHJvICU+JSAKICAgICAgICBhcnJhbmdlKGRlc2MoZG15X2htcyhGRUNIQV9BQ1RVQUxJWkFDSU9OKSksIGRlc2MoSURfQ0FORElEQVRPKSkgJT4lCiAgICAgICAgZGlzdGluY3QoRU1BSUwsLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgICAgICAgYXJyYW5nZShJRF9DQU5ESURBVE8pCmBgYAoKQ29tcHJvYmFtb3Mgc2kgcXVlZGFuIGR1cGxpY2Fkb3MKYGBge3J9CmVtYWlsc19yZXBldGlkb3MgPC0gY2FuZGlkYXRvc19tYWVzdHJvICU+JSBncm91cF9ieShFTUFJTCkgJT4lCiAgICAgICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgCiAgICAgICAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lIGZpbHRlcihjb3VudCA+IDEpCnByaW50KGVtYWlsc19yZXBldGlkb3MpCmBgYAoKQSB2ZXIgY3XDoW50b3MgY2FuZGlkYXRvcyBub3MgcXVlZGFuIChwb3IgZmVjaGEgZGUgYWN0dWFsaXphY2nDs24pOgpgYGB7cn0KZmVjaGFzIDwtIHNlbGVjdChjYW5kaWRhdG9zX21hZXN0cm8sSURfQ0FORElEQVRPLEZFQ0hBX0FDVFVBTElaQUNJT04pCmZlY2hhcyRGRUNIQV9BQ1RVQUxJWkFDSU9OIDwtIGFzLlBPU0lYY3QoZGF0ZShkbXlfaG1zKGZlY2hhcyRGRUNIQV9BQ1RVQUxJWkFDSU9OKSkpCmdncGxvdChmZWNoYXMsIGFlcyhGRUNIQV9BQ1RVQUxJWkFDSU9OKSkgKyAKICAgICAgICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbD0uLmNvdW50Li4pKSArCiAgICAgICAgbGFicyh0aXRsZT0iSGlzdG9ncmFtYSBkZSBDYW5kaWRhdG9zIEFjdHVhbGl6YWRvcyAobWVuc3VhbCkiKSArCiAgICAgICAgbGFicyh4PSJGZWNoYSIsIHk9Ik7Dum1lcm8gZGUgQWN0dWFsaXphY2lvbmVzIikgKyAKICAgICAgICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IGRhdGVfYnJlYWtzKCIxOCBtb250aHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWS0lYiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKYGBgCgpZIHBvciBmZWNoYSBkZSBhbHRhCmBgYHtyfQpmZWNoYXMgPC0gc2VsZWN0KGNhbmRpZGF0b3NfbWFlc3RybyxJRF9DQU5ESURBVE8sRkVDSEFfQUxUQSkKZmVjaGFzJEZFQ0hBX0FMVEEgPC0gYXMuUE9TSVhjdChkYXRlKGRteV9obXMoZmVjaGFzJEZFQ0hBX0FMVEEpKSkKZ2dwbG90KGZlY2hhcywgYWVzKEZFQ0hBX0FMVEEpKSArIAogICAgICAgIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsPS4uY291bnQuLikpICsKICAgICAgICBsYWJzKHRpdGxlPSJIaXN0b2dyYW1hIGRlIENhbmRpZGF0b3MgZGFkb3MgZGUgYWx0YSAobWVuc3VhbCkiKSArCiAgICAgICAgbGFicyh4PSJGZWNoYSIsIHk9Ik7Dum1lcm8gZGUgQWN0dWFsaXphY2lvbmVzIikgKyAKICAgICAgICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IGRhdGVfYnJlYWtzKCIxOCBtb250aHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWS0lYiIpCiAgICAgICAgKQpgYGAKClZhbW9zIGEgdmVyIG1lam9yIGxvcyDDumx0aW1vcyBkb3MgYcOxb3MsIGRlc2RlIEp1bmlvIGRlbCAyMDE1CgpgYGB7cn0KZmVjaGFzIDwtIHNlbGVjdChjYW5kaWRhdG9zX21hZXN0cm8sSURfQ0FORElEQVRPLEZFQ0hBX0FDVFVBTElaQUNJT04pCmZlY2hhcyRGRUNIQV9BQ1RVQUxJWkFDSU9OIDwtIGFzLlBPU0lYY3QoZGF0ZShkbXlfaG1zKGZlY2hhcyRGRUNIQV9BQ1RVQUxJWkFDSU9OKSkpCmdncGxvdChmZWNoYXMsIGFlcyhGRUNIQV9BQ1RVQUxJWkFDSU9OKSkgKyAKICAgICAgICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbD0uLmNvdW50Li4pKSArCiAgICAgICAgbGFicyh0aXRsZT0iSGlzdG9ncmFtYSBkZSBDYW5kaWRhdG9zIEFjdHVhbGl6YWRvcyAobWVuc3VhbCkiKSArCiAgICAgICAgbGFicyh4PSJGZWNoYSIsIHk9Ik7Dum1lcm8gZGUgQWN0dWFsaXphY2lvbmVzIikgKyAKICAgICAgICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IGRhdGVfYnJlYWtzKCIyIG1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVZLSViIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKGFzLlBPU0lYY3QoIjIwMTUtMDYtMDEiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTctMDYtMDEiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICApCgpgYGAKCmBgYHtyfQoKZmVjaGFzIDwtIHNlbGVjdChjYW5kaWRhdG9zX21hZXN0cm8sSURfQ0FORElEQVRPLEZFQ0hBX0FMVEEpCmZlY2hhcyRGRUNIQV9BTFRBIDwtIGFzLlBPU0lYY3QoZGF0ZShkbXlfaG1zKGZlY2hhcyRGRUNIQV9BTFRBKSkpCmdncGxvdChmZWNoYXMsIGFlcyhGRUNIQV9BTFRBKSkgKyAKICAgICAgICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbD0uLmNvdW50Li4pKSArCiAgICAgICAgbGFicyh0aXRsZT0iSGlzdG9ncmFtYSBkZSBDYW5kaWRhdG9zIGRhZG9zIGRlIGFsdGEgKG1lbnN1YWwpIikgKwogICAgICAgIGxhYnMoeD0iRmVjaGEiLCB5PSJOw7ptZXJvIGRlIEFjdHVhbGl6YWNpb25lcyIpICsgCiAgICAgICAgc2NhbGVfeF9kYXRldGltZShicmVha3MgPSBkYXRlX2JyZWFrcygiMiBtb250aHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWS0lYiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhhcy5QT1NJWGN0KCIyMDE1LTA2LTAxIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5QT1NJWGN0KCIyMDE3LTA2LTAxIikpCiAgICAgICAgKQpgYGAKCgo=